iT邦幫忙

2025 iThome 鐵人賽

DAY 3
0
Cloud Native

EKS in Practice:IaC × GitOps 實戰 30 天系列 第 3

[Day 3] Terraform 是什麼?要怎麼用?三大核心概念與實用工作流程

  • 分享至 

  • xImage
  •  

昨天的文章中有提到,在我的觀點裡,Terraform 有三個最重要的概念:ProviderStateModules

  1. Terraform 裡面有「雲端服務提供商」的概念,也就是 Provider,用於定義我們要在哪個雲端平台架設 infra,等於是整個 IaC 的基礎。
  2. 接下來,Terraform 是透過狀態在管理 infra 的,也就是 State 的概念。在初始化時,Terraform 會根據配置設定去長出現實世界的 resource,並將這個 resource 與配置內容對應。
    • 在執行任何指令之前,Terraform 都會先進行 refresh 來刷新真實 infra 的狀態。因此當我們改變 config 時,Terraform 會發現 state 與 config 不符(state difference),我們可以採用 terraform apply 來把這些現實 infra 改成像 config 所描述的一樣。
    • 預設的 Terraform 狀態會放在本地端的 terraform.tfstate 檔案中,不過為了滿足團隊協作的可能性,可以選擇將 state file 存放在雲端。Terraform 會根據 backend 設定的內容,決定這些 state file 要放置在哪裡。假設一個大兩採用 AWS resource 的情境下,則可以選擇將 state file 放在 S3 bucket 中,而我們只需要把 backend 設定為 S3 即可。
  3. 對 Terraform 而言,同一個資料夾的內容就是一個 module。我們通常會把「需要一起生成的 infra」放在同一組 module 裡,而 module 又分成 root module, child modules 和 published modules 三種
    • root module:所有 Terraform 的 configs 都至少包含一個 module,而有設定 provider/backend,並且可以執行 terraform apply 的資料夾層級就是 root module
    • child modules 與 published modules:我們可以在 root module 裡面呼叫其他的 modules,利用其他人已經定義好的 config 來幫我們長出對應的資源,而這些額外被使用的 modules 則被稱為 child modules。而 published modules 則是官方提供,或者是其他已經被開源的 modules,使用方式與 child modules 相同。

以上是一些關於 Terraform 運作的基本介紹。因此,一個簡單的 Terraform module 的範例可能會有以下的 file tree:

.
├── **example-module/**
│   ├── subnet-private.tf
│   ├── subnet-public.tf
│   └── vpc.tf
├── ec2.tf
└── main.tf

其中的 example-module/ 即為上面提到的 child module,而外層 main.tf 裡面會包含 provider 與 backend 的設定:

terraform {
  required_version = "~> 1.7"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.21"
    }
  }

  backend "s3" {
    bucket         = "example-tfstates"
    key            = "path/to/repo.tfstate"
    region         = "ap-northeast-1"
    dynamodb_table = "tf-locks"
    profile        = "tf-example-profile"
  }
}

provider "aws" {
  region  = "ap-northeast-1"
  profile = "tf-example-profile"

  default_tags {
    tags = {
      Managed = "terraform"
      Source  = "path/to/repo"
    }
  }
}

開啟 terraform 設定順序

在有了對 Terraform 的基本認識之後,接著可以來看看實際上使用 Terraform 幫我們管理 infra 的流程

  1. 設定、固定 terraform 版本

    通常會利用 tfenv 這個工具來當作 Terraform 版本的管理工具,以下是常見的指令:

    • tfenv list 查看本地現有版本
    • tfenv list-remote 查看所有現有版本
    • tfenv install x.x.x 安裝
    • tfenv use x.x.x 使用
    • tfenv pin 將當前 folder 固定為當前版本
  2. 建立檔案 main.tf,設定 provider & backend

    • Provider & profile:Terraform 可以透過 AWS 的 credential_process 執行 function,function 內可以執行取回某個 profile 的 SessionToken,讓 Terraform 可以透過這個 profile 存取資源

      📎 需要額外使用 credential_process 創造 tf-[profile] 的新 profile 原因

      • 公司現有的 roles 預設都需要 MFA 才能使用,但 terraform 沒辦法跳 prompt 輸入 MFA
      • 不使用 credential_process 都會採用跟 aws-vault 一樣的背景執行 profile

      因此,在本地的 aws-config 檔案裡,除了上面的 main.tf 範例中的 tf-example-profile,也存在另一個 profile example-profile 用來做 command line 的 assume role 用

      (細節可以參考 aws-vault 的用法,因為篇幅有限這邊暫不討論)

    • Backend 設定

      1. 和 main.tf 一樣要指定 profile
      2. 因為公司有許多不同的 account,單一個 account 下面會有很多個 terraform module,但所有 module 都會共用一個 S3 bucket 儲存 state,因此所有 backend 的 bucket 都會設定成一樣的
      3. key:S3 bucket 中 state file 的路徑,主要用來區分專案或者 module
  3. 下指令 terraform init:初始化整個 Terraform module。這個指令會把 module 中用到的 published module,以及 child modules 複製到當前目錄的 .terraform/ 中,並且初始化存放 state 的 backend,讓一切的設定可以開始運作

介紹完管理 infra 的基本概念與工具後,下一篇會先簡介該怎麼透過 Terraform 管理 EKS、以及使用 EKS 時需要用到的相關 AWS 資源,緊接著就會開始介紹 K8s 的基本概念。

現在才有種正式進入正題的感覺!


上一篇
[Day 2] 打破雲端迷霧:為什麼 IaC 是現代開發的必備技能
下一篇
[Day 4] 準備介紹 EKS,結果 AWS 網路基礎先佔掉半本筆記
系列文
EKS in Practice:IaC × GitOps 實戰 30 天5
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言